package StudyCode.Reflect.Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author lixiaoyao
 * @date 2018/10/29 0029、下午 2:45
 * @description todo
 */
public class LiuDeHuaProxy {

	// 设计一个类变量记住代理类要代理的类对象
	private Person ldh = new LiuDeHua();

	public Person getProxy() {
		return (Person) Proxy.newProxyInstance(LiuDeHuaProxy.class.getClassLoader(), ldh.getClass().getInterfaces(), new InvocationHandler() {

			/**
			 * @Author lixiaoyao
			 * @Description 在invoke 方法编码指定返回的代理对象干的工作
			 * @Date 下午 3:03 2018/10/29 0029
			 * @Param proxy：把代理对象自己传递进来  method：把代理对象当前调用的方法传递进来 args:把方法参数传递进来
			 * 当调用代理对象的person.sing("冰雨");或者 person.dance("江南style");方法
			 * 实际上执行的都是invoke方法里面的代码，
			 * 因此我们可以在invoke方法中使用method.getName()就可以知道当前调用的是代理对象的哪个方法
			 *
			 * @return
			 **/

			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// 如果调用的是代理对象的sing方法
				if (method.getName().equals("sing")) {
					System.out.println("我是他的经纪人，要找他唱歌得先给10万！！");
					// 已经给钱了，经纪人自己不会唱歌，就只能找刘德华去唱歌！
					return method.invoke(ldh, args);// 代理对象调用真实目标对象的sing方法去处理用户请求
				}

				// 如果调用的是代理对象的dance方法
				if (method.getName().equals("dance")) {
					System.out.println("我是他的经纪人，要找他跳舞得先给20万！！");
					// 已给钱了，经纪人自己不会唱歌，就只能找刘德华去跳舞！
					return method.invoke(ldh, args);// 代理对象调用真实目标对象的dance方法去处理用户请求
				}
				return null;
			}
		});
	}

}
